
import Fingerprint2 from "fingerprintjs2"
/*
* 全局公共方法
*/

/**
 * 数字保留小数位数
 * @param {string,number} val 被转换的值
 * @param {number} bit 保留的位数
 * @returns {number} 
 */
export function numFilter(val, bit = 2) {
  if (typeof val === 'number') {
    return parseFloat(val).toFixed(bit)
  } else {
    if (typeof val === 'string' && Number(val) != NaN) {
      return parseFloat(val).toFixed(bit)
    } else {
      console.log(val + '不是纯数字')
      return '--'
    }
  }
}

/**
 * 数字保留
 * @param {string,number} val 被转换的值
 * @param {number} bit 保留的位数
 * @returns {number} 
 */
export function bankNumFilter(num) {
  let logo = "";//用于记录是正值还是负值
  if (!num) return undefined;
  if (num < 0) {
    logo = "-";
    num = -num;//将负数转正,如果不转正，则下面获取它的length时，会由于有个负号，使得长度+1，最终加逗号位置出错
  }

  let result = num.toString().split("");//将数字转化为了数组，便于使用数组中的splice方法插入逗号
  let position = result.indexOf(".");//获取小数点的位置，根据有无小数点确定position最终值进入添加逗号环节
  position = position !== -1 ? position -= 1 : result.length - 1;//因为只需考虑整数部分插入逗号，所以需要考虑有没有逗号。有逗号则不等于-1，减去逗号位置，则是下标0~position就是整数部分；若不是小数，则num原本就是整数，直接取其length即可
  while (position > 2) {//只要下标值大于2，说明前面还可以插入“,”，则继续循环
    position -= 3;//下标前移3位，然后在这个下标对应的元素后面插入逗号
    result.splice(position + 1, 0, ",");
  }
  return logo + result.join("");//数组转换为字符串,前面+logo，若为负数则拼接个符号，否则拼接空字符
}

//js强制保留小数点后两位小数
export function setNumberToFixed(num) {
  if (!num) return "0.00";
  let value = Math.round(parseFloat(num) * 100) / 100;
  let xsd = value.toString().split(".");
  if (xsd.length == 1) {
    value = value.toString() + ".00";
    return value;
  }
  if (xsd.length > 1) {
    if (xsd[1].length < 2) {
      value = value.toString() + "0";
    }
    return value;
  }
}

// 获取浏览指纹
export function getFingerprint() {
  return new Promise((reslove, reject) => {
    const createFingerprint = () => {
      const compData = {
        values: undefined,
        murmur: undefined,
      }
      Fingerprint2.get((components) => {
        compData.values = components.map(component => component.value) // 配置的值的数组
        compData.murmur = Fingerprint2.x64hash128(compData.values.join(""), 31).toUpperCase() // 生成浏览器指纹
        reslove(compData)
      })
    }
    if (window.requestIdleCallback) {
      requestIdleCallback(() => {
        createFingerprint()
      })
    } else {
      setTimeout(() => {
        createFingerprint()
      }, 600)
    }
  })
}

// 获取网络IP地址
export function getIpAddress(timeout = 1000) {

  const ipv4Regex =
    /\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/;

  const ipv6Regex = /\b(?:[A-F0-9]{1,4}:){7}[A-F0-9]{1,4}\b/i;

  // prettier-ignore
  // @ts-expect-error
  globalThis.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection
  const ipSet = new Set();

  const onicecandidate = (ice) => {
    const candidate = ice?.candidate?.candidate;
    if (candidate) {
      for (const regex of [ipv4Regex, ipv6Regex]) {
        const [ip] = candidate.match(regex) ?? [];
        if (ip) {
          ipSet.add(ip);
        }
      }
    }
  };

  return new Promise((resolve, reject) => {
    const conn = new globalThis.RTCPeerConnection({
      iceServers: [
        {
          urls: 'stun:stun.l.google.com:19302',
        },
      ],
    });
    conn.addEventListener('icecandidate', onicecandidate);
    conn.createDataChannel('');
    conn.createOffer().then((offer) => conn.setLocalDescription(offer), reject);

    setTimeout(() => {
      try {
        conn.removeEventListener('icecandidate', onicecandidate);
        conn.close();
      } catch {
        // ignore
      }

      resolve([...ipSet]);
    }, timeout);
  });
};

